package Top101K;

/**
 * @Author quan
 * @Description 寻找峰值
 * @Date 2023/11/22 11:42
 */
public class BM19_FindPeakElement {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};
        System.out.println(findPeakElement(arr));
    }

    /**
     * 给定一个长度为n的数组nums，请你找到峰值并返回其索引。数组可能包含多个峰值，在这种情况下，返回任何一个所在位置即可。
     * 峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于.对于所有有效的 i 都有 nums[i] != nums[i + 1]
     * @param nums [2,4,1,2,7,8,4]
     * @return 1或者5
     * 4和8都是峰值元素，返回4的索引1或者8的索引5都可以
     */
    public static int findPeakElement (int[] nums) {
        // 边界条件
        if(nums.length == 1){
            return 0;
        }
        if(nums.length == 2){
            if(nums[0] < nums[1]){
                return 1;
            }else{
                return 0;
            }
        }
        // 1-for循环，遍历位置从1到数组末尾-1；
        // 2-普通情况下：如果num[i] > num[i-1] && num[i] < num[i+1]，就返回i值；
        boolean flag = false;
        int res = 0;
        for (int i = 1; i < nums.length-1; i++) {
            if(nums[i] > nums[i-1] && nums[i] > nums[i+1]){
                res = i;
                return res;
            }
            // 3-数组是升序情况，则直接返回数组长度-1；
            if(nums[i] > nums[i-1]){
                flag = true;
            }else {
                // 4-数组是降序情况，直接返回0。
                flag = false;
            }
        }
        if(flag){
            res =  nums.length-1;
        }else{
            res =  0;
        }
        return res;
    }
}
